#ifndef __DSTH_SOCKET_WIN_H__
#define __DSTH_SOCKET_WIN_H__

#include "DSTHType.h"
#ifdef IS_WINDOWS
  //#include <winsock2.h>
#else
  #include <arpa/inet.h>
#endif

namespace dsth {
namespace net {
    int CreateNonblockSocketOrDie();
    int BindOrDie(int fd, const struct sockaddr_in& addr);
    int ListenOrDie(int fd);
    void Close(int fd);
    int Accept(int fd, struct sockaddr_in& addr);
    int Write(int fd, const char* data, size_t len);
    int Read(int fd, char* buf, size_t len);
    int Connect(int fd, const struct sockaddr_in& addr);
    struct sockaddr_in GetHostAddr(int sockfd);
    struct sockaddr_in GetPeerAddr(int sockfd);
    void ToHostPortFormat(char* buf, size_t buf_len, const struct sockaddr_in& addr);
    int GetSockErr(int fd);
    void SetReuse(bool enable, int fd);
    void ShutDownWrite(int fd);
    int32_t N2H_32(int32_t be);
    int32_t H2N_32(int32_t le);
#ifdef IS_WINDOWS
    int Readv(int fd, WSABUF* buf, int buf_count, int* recv_bytes, int* flag);
#else // POSIX
    ssize_t Readv(int fd, iovec* buf, int buf_count);
#endif
}// net
}// dsth
#endif // __DSTH_SOCKET_WIN_H__
